home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The 640 MEG Shareware Studio 2
/
The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO
/
clang
/
tcisam.zip
/
IOPEN.C
< prev
next >
Wrap
Text File
|
1987-08-21
|
4KB
|
129 lines
/*
* IOPEN.C - open and close functions
*
* Copyright (c) 1987, Jim Mischel
* Modifications:
*
* 08/13/87 - jim - original coding
*/
#include "inxdefs.h"
/*
* iopen() - open file for indexed access and setup fields in control record.
* If successful, returns a pointer to the control record. Returns NULL
* if unsuccessful. If the routine is unable to open an existing file,
* a new file is created. It is possible to create a new index for an
* existing data file, or a new data file for an existing index file.
* In either case, no data will be lost, but new data could be added to
* the end of the file.
*/
void *iopen(char *fname, unsigned recsiz, char keytyp, unsigned offset,
char dupflag, int (*cmp_rtn)())
{
register df_rec *db_control;
char *path;
inx_rec *irec;
/* allocate space for control record */
if ((db_control = malloc(sizeof(df_rec))) == NULL) {
ierror(I_NOMEM); /* out of memory */
return(NULL);
}
/* allocate space for data buffer */
if ((db_control->df_dat_buff = malloc(recsiz)) == NULL) {
ierror(I_NOMEM); /* out of memory */
goto free_control;
}
/* allocate space for pathname */
if ((db_control->df_path = malloc(strlen(fname))) == NULL) {
ierror(I_NOMEM);
goto free_datbuf;
}
/* copy pathname to control record */
strcpy(db_control->df_path,fname);
/* open index file */
if ((path = malloc(256)) == NULL) {
ierror(I_NOMEM); /* out of memory */
goto free_fname;
}
strcpy(path,fname);
if ((db_control->df_inx_file = fopen(strcat(path,".INX"),"r+b")) == NULL) {
/* can't open index file, so create a new one */
if ((db_control->df_inx_file = fopen(path,"w+b")) == NULL) {
ierror(I_NOINX); /* couldn't create index file */
goto free_path;
}
else {
/* new index file created. Add header node */
irec = &db_control->df_inx_buff;
irec->if_dat_ptr = 0L;
irec->if_right_node = 0L;
irec->if_left_node = 0L;
irec->if_parent = 0L;
irec->if_flags = BTHRD+ETHRD+LTHRD+RTHRD;
if (iwrite_inx(db_control,irec,0L)) {
ierror(I_INXWT); /* couldn't write header record */
goto free_path;
}
}
}
strcpy(path,fname);
if ((db_control->df_dat_file = fopen(strcat(path,".DAT"),"r+b")) == NULL) {
/* can't open data file, so create a new one */
if ((db_control->df_dat_file = fopen(path,"w+b")) == NULL) {
ierror(I_NODAT); /* couldn't create data file */
goto close_inx;
}
}
/* setup key comparison routine. */
if (cmp_rtn != NULL)
db_control->df_cmp = cmp_rtn;
else
db_control->df_cmp = icmp_rtns[keytyp];
db_control->df_rec_size = recsiz;
db_control->df_key_offset = offset;
db_control->df_key_ptr = db_control->df_dat_buff + offset;
db_control->df_nxt_ptr = 0L;
db_control->df_inx_ptr = 0L;
db_control->df_dat_ptr = 0L;
db_control->df_flags = DF_EOF + DF_TOF + DF_DELETE + ((dupflag) ? DF_DUP : 0);
free(path); /* don't need this anymore */
ierror(0); /* no problem */
return(db_control);
close_inx:
fclose(db_control->df_inx_file);
free_path:
free(path);
free_fname:
free(db_control->df_path);
free_datbuf:
free(db_control->df_dat_buff);
free_control:
free(db_control);
return(NULL);
} /* iopen */
/*
* iclose() - close files and free space used by control record
*/
void iclose(void *d)
{
register df_rec *db_control = (df_rec *)d;
fclose(db_control->df_dat_file);
fclose(db_control->df_inx_file);
free(db_control->df_path);
free(db_control->df_dat_buff);
free(db_control);
} /* iclose */